package com.yupi.yuaicodemother.core.saver;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.yupi.yuaicodemother.exception.BusinessException;
import com.yupi.yuaicodemother.exception.ErrorCode;
import com.yupi.yuaicodemother.model.enums.CodeGenTypeEnum;
import org.springframework.util.StringUtils;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * @Author: LZY
 * @CreateTime: 2025-10-07
 * @Description: 抽象代码文件保存器 - 模板方法模式
 * @Version: 1.0
 */

public abstract class CodeFileSaverTemplate<T> {

    // 文件保存根目录
    private static final String FILE_SAVE_ROOT_DIR = System.getProperty("user.dir") + "/tmp/code_output";




    public final File saveCode(T result,Long appId){
        //1.验证输入
        validateInput(result);
        //2.构建唯一目录
        String baseDirPath = buildUniqueDir(appId);
        //3.保存文件（具体实现由子类提供）
         saveFiles(result,baseDirPath);
         //4.返回目录文件对象
        return new File(baseDirPath);


    }


    /**
     * 验证输入参数（可有子类覆盖）
     * @param result 代码结果对象
     */
    protected void validateInput(T result){
        if (result == null){
            throw new BusinessException(ErrorCode.SYSTEM_ERROR,"代码结果对象不能为空");
        }
    }


//    /**
//     * 构建唯一目录路径：tmp/code_output/bizType_雪花ID
//     */
//    private static String buildUniqueDir(String bizType) {
//        String uniqueDirName = StrUtil.format("{}_{}", bizType, IdUtil.getSnowflakeNextIdStr());
//        String dirPath = FILE_SAVE_ROOT_DIR + File.separator + uniqueDirName;
//        FileUtil.mkdir(dirPath);
//        return dirPath;
//    }
    /**
     * 构建唯一目录路径：tmp/code_output/bizType_雪花ID
     */
    private  String buildUniqueDir(Long appId) {
        if (appId == null){
            throw new BusinessException(ErrorCode.SYSTEM_ERROR,"应用 ID 不能为空");
        }
        String codeType = getCodeType().getValue();
        String uniqueDirName = StrUtil.format("{}_{}", codeType, IdUtil.getSnowflakeNextIdStr());
        String dirPath = FILE_SAVE_ROOT_DIR + File.separator + uniqueDirName;
        FileUtil.mkdir(dirPath);
        return dirPath;
    }

    /**
     * 写入单个文件
     */
    protected static void writeToFile(String dirPath, String filename, String content) {
        if (!StringUtils.isEmpty(content)) {
            String filePath = dirPath + File.separator + filename;
            FileUtil.writeString(content, filePath, StandardCharsets.UTF_8);
        }
    }

    /**
     * 获取代码类型（有子类实现）
     * @return 代码生成类型
     */
    protected abstract CodeGenTypeEnum getCodeType();


    /**
     *  保存问价的具体实现（由子类实现）
     * @param result 代码结果对象
     * @param baseDirPath 基础目录路径
     */
    protected abstract void saveFiles(T result,String baseDirPath);
}
